Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 25.01.2017, 22:04
Аспирант
Отправить личное сообщение для Ramundo Посмотреть профиль Найти все сообщения от Ramundo
 
Регистрация: 07.03.2015
Сообщений: 47

Преимущество multipart/form-data перед application/x-www-form-urlencoded
Сейчас читаю https://learn.javascript.ru/xhr-forms, и там пишут следующее:

"multipart/form-data - такой способ используется в первую очередь при пересылке файлов, так перекодировка мегабайтов через urlencoded существенно загрузила бы браузер. Да и объём данных после неё сильно вырос бы.

Однако, никто не мешает использовать эту кодировку всегда для POST запросов. Для GET доступна только urlencoded.

Сделать POST-запрос в кодировке multipart/form-data можно и через XMLHttpRequest.

Достаточно указать в заголовке Content-Type кодировку и границу, и далее сформировать тело запроса, удовлетворяющее требованиям кодировки.

Пример кода для того же запроса, что и раньше, теперь в кодировке multipart/form-data:"

var data = {
  name: 'Виктор',
  surname: 'Цой'
};

var boundary = String(Math.random()).slice(2);
var boundaryMiddle = '--' + boundary + '\r\n';
var boundaryLast = '--' + boundary + '--\r\n'

var body = ['\r\n'];
for (var key in data) {
  // добавление поля
  body.push('Content-Disposition: form-data; name="' + key + '"\r\n\r\n' + data[key] + '\r\n');
}

body = body.join(boundaryMiddle) + boundaryLast;

// Тело запроса готово, отправляем

var xhr = new XMLHttpRequest();
xhr.open('POST', 'server.php', true);

xhr.setRequestHeader('Content-Type', 'multipart/form-data; boundary=' + boundary);

xhr.onreadystatechange = function() {
  if (this.readyState != 4) return;

  alert( this.responseText );
}

xhr.send(body)


Так вот, я затестил этот метод, и он отправляет на сервер 183 байта (в PHP значение $_SERVER["content-length"] = 183).

Затем использовал обычный метод (application/x-www-form-urlencoded):
var  name = 'Виктор';
  var surname = 'Цой';
var xhr = new XMLHttpRequest();

var body = 'name=' + encodeURIComponent(name) +
  '&surname=' + encodeURIComponent(surname);

xhr.open("POST", 'server.php', true)
xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded')

xhr.onreadystatechange = ...;

xhr.send(body);


В результате $_SERVER["content-length"] = 32 байта. На сервер пришло почти в 6 раз меньше. Нагрузка на него тоже меньше, получается.


Значит, для посылки обычного текста лучше использовать application/x-www-form-urlencoded?
Ответить с цитированием
  #2 (permalink)  
Старый 25.01.2017, 22:35
Аспирант
Отправить личное сообщение для Ramundo Посмотреть профиль Найти все сообщения от Ramundo
 
Регистрация: 07.03.2015
Сообщений: 47

Сообщение от Rise Посмотреть сообщение
Ramundo, затести на кириллице, по твоей ссылке:
Передаю теперь только это через application/x-www-form-urlencoded :
var name = "Термин историография имеет несколько значений. Во-первых, это наука о том, как пишется история, насколько правильно";


В результате $_SERVER[CONTENT_LENGTH] => 216


И только это через multipart/form-data :
var data = {
  name: "Термин историография имеет несколько значений. Во-первых, это наука о том, как пишется история, насколько правильно" 
 };


В результате $_SERVER[CONTENT_LENGTH] => 304

Последний раз редактировалось Ramundo, 25.01.2017 в 22:53.
Ответить с цитированием
  #3 (permalink)  
Старый 25.01.2017, 22:47
Аспирант
Отправить личное сообщение для Ramundo Посмотреть профиль Найти все сообщения от Ramundo
 
Регистрация: 07.03.2015
Сообщений: 47

1) multipart/form-data:
var data = {
  name: "test"
 };

$_SERVER[CONTENT_LENGTH] => 97


2)application/x-www-form-urlencoded:
var name = "test";

$_SERVER[CONTENT_LENGTH] => 9
Ответить с цитированием
  #4 (permalink)  
Старый 25.01.2017, 22:53
Аспирант
Отправить личное сообщение для Ramundo Посмотреть профиль Найти все сообщения от Ramundo
 
Регистрация: 07.03.2015
Сообщений: 47

Сорри, перепутал местами результаты. Поправил. Глянь еще раз. Я щас еще извращаюсь , передаю большое количество символов на кирилице и на латыни. И всегда multipart/form-data-способ "приносит" на плюс-минус 100 байт больше

Последний раз редактировалось Ramundo, 25.01.2017 в 22:57.
Ответить с цитированием
  #5 (permalink)  
Старый 25.01.2017, 23:08
Аспирант
Отправить личное сообщение для Ramundo Посмотреть профиль Найти все сообщения от Ramundo
 
Регистрация: 07.03.2015
Сообщений: 47

Короче, в основном выходит так:
Если передаю два-три слова, то application/x-www-form-urlencoded выигрывает сильно. Раз в 8-9.

Если 100+ символов, то application/x-www-form-urlencoded выигрывает на примерно 100 байт. И если передавать стену текста, то можно пожертвовать 100 байтами и использовать multipart/form-data, чтобы не грузить пользовательский браузер перекодировкой. Ну, это я типа так понял
Ответить с цитированием
  #6 (permalink)  
Старый 25.01.2017, 23:18
Аспирант
Отправить личное сообщение для Ramundo Посмотреть профиль Найти все сообщения от Ramundo
 
Регистрация: 07.03.2015
Сообщений: 47

У тебя показывается длина текста, у меня байты, что приходят на сервер

Я еще с php-шниками пообщаюсь насчет этого, напишу , че ответили потом. Нужно разобрать это дерьмо)
Ответить с цитированием
  #7 (permalink)  
Старый 25.01.2017, 23:22
Аспирант
Отправить личное сообщение для Ramundo Посмотреть профиль Найти все сообщения от Ramundo
 
Регистрация: 07.03.2015
Сообщений: 47

Сообщение от Rise Посмотреть сообщение
Ramundo, твои тесты не верные смотри пост#7.
ты шаришь в PHP? Не знаешь , как узнать, какой объем данных пришел на сервер? Я знаю только способ прочесть заголовок $_SERVER[CONTENT_LENGTH]. Может он неверный.
Ответить с цитированием
  #8 (permalink)  
Старый 26.01.2017, 11:59
Аватар для Alexandroppolus
Профессор
Отправить личное сообщение для Alexandroppolus Посмотреть профиль Найти все сообщения от Alexandroppolus
 
Регистрация: 25.10.2016
Сообщений: 1,013

Ramundo,

на мелких текстах multipart/form-data проиграет, потому что там разделители, и т.д.

На латинице тоже не выиграет, латиница передается как есть (всегда 1 байт на символ), и опять же будут разделители.

Но кириллица передается в multipart/form-data в кодировке utf8, это 2 байта на символ. А в application/x-www-form-urlencoded на одну русскую букву приходится 6 байт. Можешь сам посчитать, с какого момента (при той или иной длине разделителей и их количестве) multipart/form-data сможет выиграть.
Ответить с цитированием
  #9 (permalink)  
Старый 26.01.2017, 17:46
Аспирант
Отправить личное сообщение для fuckingquest Посмотреть профиль Найти все сообщения от fuckingquest
 
Регистрация: 28.10.2016
Сообщений: 70

Сообщение от Ramundo
в кодировке multipart/form-data
Это кодировка?
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск